try:
    from greenlet import getcurrent as get_ident
except Exception as e:
    from threading import get_ident

from threading import Thread
import time


class Local(object):

    def __init__(self):
        # self.storage = {}
        # 为什么不能直接这样，因为当进来Local对象中的self.storage是调用内部的__setattr__方法创建的，但是这里被我们重写了，所以不会去创建实例变量
        # 我们就要去调用父类的__setattr__方法进行创建
        object.__setattr__(self, 'storage', {})  # self.storage = object.__setattr__(self, 'storage', {})

    def __setattr__(self, k, v):
        ident = get_ident()
        if ident in self.storage:
            self.storage[ident][k] = v
        else:
            self.storage[ident] = {k: v}

    def __getattr__(self, k):
        ident = get_ident()
        return self.storage[ident][k]


obj = Local()


def task(arg):
    obj.val = arg  # 在类中实现了__setattr__（k,v） 就可以通过 对象.key =值 直接存
    # print(obj.storage)
    # obj.xxx = arg
    time.sleep(2)
    print(obj.val)  # 在类中实现了__getattr__（k,） 就可以通过 对象.key 直接获取字典的值


for i in range(10):
    t = Thread(target=task, args=(i,))
    t.start()

"""
1.可以通过协程的方式或者线程的方式创建


{24244: {'val': 0}}
{24244: {'val': 0}, 19356: {'val': 1}}
"""
